//战斗指令工具类

/**
 * 解析并执行战斗命令
 * @param {*} fight_data 战斗数据
 * @param {*} action_order 执行顺序
 */
export function execute_fight_cmd(fight_data, action_order) {
    console.debug(`解析并执行战斗命令`)
    let first_team = fight_data["队伍数据"][action_order[0][0]];
    let first_order = action_order[0][1];
    let last_team = fight_data["队伍数据"][action_order[1][0]];
    let last_order = action_order[1][1];
    fight_data["战斗流程"].push({ "流程": 6 });
    //执行第一个队伍的成员指令
    console.debug(`执行队伍[${action_order[0][0]}]的成员指令`)
    execute_team_fight_cmd(fight_data, first_order, first_team);
    console.debug(`执行队伍[${action_order[1][0]}]的成员指令`)
    //执行第二个队伍的成员指令
    execute_team_fight_cmd(fight_data, last_order, last_team);
}

/**
 * 执行参战队伍的战斗指令
 * @param {*} fight_data 战斗数据
 * @param {*} my_order 队员下标排序
 * @param {*} my_team 友方队伍
 */
function execute_team_fight_cmd(fight_data, my_order, my_team) {
    console.debug(`执行参战队伍的战斗指令`)
    //按照下标顺序执行每个战斗单位的指令
    for (let index = 0; index < my_order.length; index++) {
        let fight_unit_index = my_order[index];
        let fight_unit = my_team[fight_unit_index];
        console.debug(`执行编号 ${fight_unit["编号"]} 的战斗指令 => 类型: ${fight_unit["类型"]} 气血: ${fight_unit["气血"]}`);
        // 计算与补充指令
        computing_src_unit_cmd(fight_data, fight_unit);
        // 正常演算流程
        G.FightComputingUtils.computing_process_data(fight_data, fight_unit);
    }
    // TDDO 被复活的参战单位继续执行指令

    // if self.复活后继续 then --复活后继续执行
    // 	  for nvx=1,#self.复活后继续 do
    // 	  	  self:复活后继续执行(战斗数据,self.复活后继续[nvx])
    // 	  end
    // end
    // for kn,vn in pairs(self.超级神迹复活) do
    // 	if 战斗数据.参战单位[vn.bb]~=nil and 战斗数据.参战单位[vn.bb].气血 > 0 then
    //     if 取随机数(1,100) <= 99 then
    // 			  self:超级神迹复活主人(战斗数据,vn.rw,vn.bb)
    // 		else
    // 			  战斗数据.战斗流程[#战斗数据.战斗流程+1]={流程=6,战斗提示={内容="尝试复活失败",编号=vn.bb}}
    // 		end
    // 	end
}

/**
 * 构建一个普通攻击指令
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @returns 
 */
function build_attak_cmd(fight_data, src_unit) {
    // 寻找一个敌方目标
    let target_unit = G.FightUtils.get_enemy_team_single_survive_unit(fight_data, src_unit);
    // 设置指令
    return {
        "附加": 4,
        "目标": target_unit ? target_unit["编号"] : "",
        "类型": "攻击",
        "参数": ""
    };
}

/**
 * 计算战斗单位的指令
 * @param {*} fight_data 
 * 
 * @param {*} fight_unit 
 */
function computing_src_unit_cmd(fight_data, fight_unit) {
    console.debug(`计算战斗单位的指令, 编号: ${fight_unit["编号"]} 类型: ${fight_unit["类型"]}`);
    if (fight_unit["自动战斗"]) {
        console.debug(`计算与补充指令 => 自动战斗`)
        if (fight_unit["自动指令"]) {
            fight_unit["指令"] = fight_unit["自动指令"];
            if (fight_unit["指令"]["类型"] === "法术") {
                console.debug(`计算与补充指令 => 使用主动技能`)
                let skill_name = fight_unit["指令"]["参数"];
                let skill = G.FightUnitUtils.get_unit_skill_data(fight_unit, "主动技能", skill_name);
                if (skill && (skill["剩余冷却回合"] === undefined || skill["剩余冷却回合"] <= 0)) {
                    G.FightUtils.get_target_unit_by_skill_name(fight_data, fight_unit, fight_unit["指令"]["参数"]);
                } else {
                    console.debug(`计算与补充指令 => 主动技能冷却中 使用普通攻击`)
                    fight_unit["指令"] = build_attak_cmd(fight_data, fight_unit);
                }
            } else if (fight_unit["指令"]["类型"] === "攻击"){
                let target_unit = G.FightUtils.get_fight_unit_by_number(fight_data, fight_unit["指令"]["目标"]);
                // 如果是自动战斗指令目标可能为空，需要自动补充一个敌方目标
                if (target_unit === undefined) {
                    console.debug(`计算与补充指令 => 补充自动战斗的敌方目标`);
                    fight_unit["指令"] = build_attak_cmd(fight_data, fight_unit);
                }
            }
        } else {
            console.debug(`计算与补充指令 => 没有历史自动指令, 使用普通攻击`)
            fight_unit["指令"] = build_attak_cmd(fight_data, fight_unit);
        }
    }
    if (fight_unit["类型"] === "怪物") {
        if (fight_unit["AI"]) {
            // 是否指定了本回合的命令
            if (fight_unit["AI"][fight_data["回合"]]) {
                console.debug(`计算与补充指令 => 回合指令`);
                fight_unit["指令"] = fight_unit["AI"][fight_data["回合"]];
            } else if (fight_unit["AI"]["*"]) {
                console.debug(`计算与补充指令 => 默认指令`);
                fight_unit["指令"] = fight_unit["AI"]["*"];
            // }
            //  else if (fight_unit["AI"]["类型"] === "辅助") {
            //     console.debug(`计算与补充指令 => 释放辅助技能`);
            } else if (fight_unit["主动技能"].length > 0) {
                console.debug(`计算与补充指令 => 使用主动技能`);
                // 计算技能CD
                let tmp_skill = [];
                for (let index = 0; index < fight_unit["主动技能"].length; index++) {
                    let skill = fight_unit["主动技能"][index];
                    if (skill["剩余冷却回合"] === undefined || skill["剩余冷却回合"] <= 0) {
                        tmp_skill.push(skill["名称"]);
                    }
                }
                if (tmp_skill.length > 0) {
                    fight_unit["指令"] = { "附加": 4, "目标": "0", "类型": "法术", "参数": G.RandomUtils.random_get_array(fight_unit["主动技能"])["名称"] };
                } else {
                    console.debug(`计算与补充指令 => 所有主动技能冷却中 补充普通攻击目标`);
                    fight_unit["指令"] = build_attak_cmd(fight_data, fight_unit);
                }
            } else {
                console.debug(`计算与补充指令 => 补充普通攻击目标`);
                fight_unit["指令"] = build_attak_cmd(fight_data, fight_unit);
            }
            if (fight_unit["指令"]["类型"] === "法术") {
                //补充目标
                console.debug(`计算与补充指令 => 补充法术目标 => ${fight_unit["指令"]["参数"]}`);
                G.FightUtils.get_target_unit_by_skill_name(fight_data, fight_unit, fight_unit["指令"]["参数"]);
            }
        } else {
            fight_unit["指令"] = { "附加": 4, "目标": "0", "类型": "防御", "参数": "" };
        }
    }
    if (fight_unit["指令"] === undefined) {
        fight_unit["指令"] = { "目标": "", "类型": "", "参数": "" };
    }
    console.debug(`战斗单位最终指令： ${JSON.stringify(fight_unit["指令"])}`);
}

